﻿// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// 
// Copyright (c) 2012, Dr. Masroor Ehsan
// All rights reserved.
// 
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//    * Neither the name of the <organization> nor the
//      names of its contributors may be used to endorse or promote products
//      derived from this software without specific prior written permission.
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// 
// $Id: BillabeItemsEditForm.cs 12 2012-01-27 06:11:46Z masroore@gmail.com $
// 
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

using System;
using System.Windows.Forms;
using LWObjects;

namespace LWEditor
{
    public partial class BillabeItemsEditForm : Form
    {
        private bool _isNewRow;

        public BillabeItemsEditForm()
        {
            InitializeComponent();
        }

        private void BillabeItemsEditForm_Load(object sender, EventArgs e)
        {
            LoadItemsInGrid();
        }

        private void LoadItemsInGrid()
        {
            _isNewRow = false;
            grdItems.BeginInit();
            try
            {
                grdItems.DataRows.Clear();
                foreach (var item in BillableItemsCatalog.Instance.Values)
                {
                    var row = grdItems.DataRows.AddNew();
                    row.Cells["Name"].Value = item.Name;
                    row.Cells["Code"].Value = item.Code;
                    row.Cells["Price"].Value = item.Price;
                    row.Tag = item;
                    row.EndEdit();
                }
            }
            finally
            {
                grdItems.EndInit();
            }
            dataGridView1_SelectionChanged(null, null);
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
        }

        private void InitTextBoxes(BillableItem item)
        {
            if (item == null)
            {
                txtCode.Text = "";
                txtName.Text = "";
                txtPrice.Text = "";
                rbPerReq.Checked = true;
            }
            else
            {
                txtCode.Text = item.Code;
                txtName.Text = item.Name;
                txtPrice.Text = item.Price;
                switch (item.OptimizationLevel)
                {
                    case BillableItemOptimizationLevel.PerOrder:
                        rbPerOrder.Checked = true;
                        break;
                    default:
                        rbPerReq.Checked = true;
                        break;
                }
            }
        }

        private void btnDeleteRow_Click(object sender, EventArgs e)
        {
            if (grdItems.SelectedRows.Count > 0)
            {
                if (MessageBox.Show(@"Really delete?", @"Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    var itemToDelete = (BillableItem) grdItems.SelectedRows[0].Tag;
                    if (itemToDelete != null)
                    {
                        BillableItemsCatalog.Instance.Remove(itemToDelete.Code);
                        LoadItemsInGrid();
                    }
                }
            }
        }

        private void btnNewRow_Click(object sender, EventArgs e)
        {
            _isNewRow = true;
            InitTextBoxes(null);
            txtCode.Focus();
        }

        private void btnSaveRow_Click(object sender, EventArgs e)
        {
            var item = _isNewRow ? new BillableItem() : (BillableItem) grdItems.SelectedRows[0].Tag;
            var code = txtCode.Text.Trim().ToUpper();
            var name = txtName.Text.Trim();
            var price = txtPrice.Text.Trim();
            if ((name == string.Empty) || (code == string.Empty) || (price == string.Empty))
            {
                MessageBox.Show(@"Empty fields are not allowed!");
                return;
            }

            item.Code = code;
            item.Name = name;
            item.Price = price;
            item.OptimizationLevel = rbPerOrder.Checked
                                         ? BillableItemOptimizationLevel.PerOrder
                                         : BillableItemOptimizationLevel.PerRequisition;
            if (_isNewRow) BillableItemsCatalog.Instance.Add(item.Code, item);
            _isNewRow = false;
            LoadItemsInGrid();
        }

        private void btnSaveCollection_Click(object sender, EventArgs e)
        {
            BillableItemsCatalog.Instance.SaveToDefinitionFile(Utils.BILLABLE_ITEMS_DEFINITION_FILE);
            BillableItemsCatalog.Instance.LoadFromDefinitionFile(Utils.BILLABLE_ITEMS_DEFINITION_FILE);
            MessageBox.Show(@"Billable Items saved to disk.");
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
        }

        private void grdItems_SelectedRowsChanged(object sender, EventArgs e)
        {
            if (grdItems.SelectedRows.Count == 1)
            {
                _isNewRow = false;
                InitTextBoxes((BillableItem) grdItems.SelectedRows[0].Tag);
            }
        }
    }
}